<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>this</title>
  </head>
  <body>
    <script>
      //  //T1.
      // function fun() {
      //   console.log(this.s);
      // }
      // var obj = {
      //   s: 1,
      //   f: function(){
      //     console.log(this.s);
      //   },
      // };
      // var s = 2;
      // obj.f();
      /* 
      obj对象调用自身方法，输出1
      */

      // //T2.
      // function fun() {
      //   console.log(this.s);
      //   var obj = {
      //     s: 1,
      //     f: fun,
      //   };
      // }
      // var s = 2;
      // fun();//this指向window
      /* 
      window对象调用fun，this指向window，s就是window的全局变量s-》2
      */

      // //T3.
      // var A = {
      //   name: "jmq",
      //   f: function () {
      //     console.log(this.name);
      //   },
      // };
      // var B = {
      //   name: "syc",
      //   f: function () {
      //     console.log(this.name);
      //   },
      // };
      // B.f = A.f;
      // A.f();
      // B.f();
      /* 
      两个对象分别调用自己的方法，this指向对象A，B，输出自身的name
        jmq，syc
      */

      // //T4.
      // function fo() {
      //   console.log(this.a);
      // }
      // var o1 = {
      //   a: 3,
      // };
      // var o2 = {
      //   a: 6,
      // };
      // var a = 9;
      // o1.f = fo;
      // /*
      // o1={
      //   a:3
      //   f:function(){
      //         console.log(this.a);
      //   }
      // }
      // */
      // console.log(o1); //=>{a:3,f:function}
      // o2.f = o1.f;
      // /*
      //  o2={
      //   a:6
      //   f:function(){
      //         console.log(this.a);
      //   }
      // }
      //  */
      // o1.f(); // 输出什么？ 3
      // o2.f(); // 输出什么？ 6

      ////T5.
      // function foo() {
      //   console.log(this.a);
      // }
      // var obj2 = {
      //   a: 2,
      //   fn: foo,
      // };
      // var obj1 = {
      //   a: 1,
      //   o1: obj2,
      //   /*
      //   o1:{
      //     a:2,
      //     fn:function(){
      //       log(this.a)
      //     }
      //   }
      //   */
      // };
      // obj1.o1.fn(); // 输出的是啥？
      /* 
      最后调用的对象是obj2，打印obj2的a->2
      */
      // //T6.
      // var a = 10;
      // var obj = {
      //   a: 120,
      //   method: function () {
      //     var bar = function () {
      //       console.log(this.a); // 输出什么？ 10
      //     };
      //     bar();
      //     return this.a; // 输出什么？120
      //   },
      // };
      // console.log(obj.method());
      /*

      obj调用method ，其this指向obj，return this.a->obj的a 120
      bar（），window调用，this-》window，-》window的a->10
       */
      //T7.
      // var fullName = "language";
      // var obj = {
      //   fullName: "javascript",
      //   prop: {
      //     getFullName: function () {
      //       return this.fullName;
      //     },
      //   },
      // };
      // console.log(obj.prop.getFullName()); // 这里输出什么？
      // /*
      // 最后是prop调用getFullName，this指向prop这个对象
      // prop里面没有fullName这个属性-》undefined
      // */
      // var test = obj.prop.getFullName;
      // console.log(test()); // 这里输出什么
      /* 
      window调用-》this指向window-》window里面的fullName=》language
      */
      // //T8.
      // function fn() {
      //   console.log(this);
      // }
      // setInterval(fn, 1000); // 这里打印啥？ window

      // //T9.
      // var k = {
      //   a: 1,
      //   sing: function () {
      //     console.log(this);
      //   },
      // };
      // setTimeout("k.sing()", 1000); // 这里打印的是啥？
      /* 
      最后调用sing的对象是-》k=》this-》k
      k
      */
      // //T10.
      // var value = 8;
      // var obj = {
      //   value: 10,
      //   fn: () => {
      //     console.log(this.value); //打印什么
      //   },
      // };
      // obj.fn();
      //在箭头函数中this往往指向window-》8
    </script>
  </body>
</html>